#include "head.h"
// 发送小文件
//int transFile(int netfd){
//    //send(netfd,"file1",5,0); // 发送文件名
//    //int fd = open("file1",O_RDWR);
//    //ERROR_CHECK(fd,-1,"open");//打开文件
//    //char buf[4096] = {0};
//    //ssize_t sret = read(fd,buf,sizeof(buf));
//    //send(netfd,buf,sret,0);//读了多少发多少
//    train_t train;
//    train.length = 5;
//    memcpy(train.data,"file1",5);//组装第一列小火车
//    //发送小火车
//    send(netfd,&train,sizeof(train.length)+train.length,0);
//    int fd = open("file1",O_RDWR);
//    // 将文件的数据读取到小火车的车厢部分
//    ssize_t sret = read(fd,train.data,sizeof(train.data));
//    train.length = sret;
//    //发送小火车
//    send(netfd,&train,sizeof(train.length)+train.length,0);
//    return 0;
//}
// 发送大文件
//int transFile(int netfd){
//    train_t train;
//    train.length = 5;
//    memcpy(train.data,"file1",5);//组装第一列小火车
//    //发送小火车
//    send(netfd,&train,sizeof(train.length)+train.length,MSG_NOSIGNAL);
//    int fd = open("file1",O_RDWR);
//    while(1){
//        // 将文件的数据读取到小火车的车厢部分
//        ssize_t sret = read(fd,train.data,sizeof(train.data));
//        train.length = sret;
//        //发送小火车
//        send(netfd,&train,sizeof(train.length)+train.length,MSG_NOSIGNAL);
//        if(sret == 0){
//            break;
//        }
//    }
//    close(fd);
//    return 0;
//}
//显示进度条
int transFile(int netfd){
    train_t train;
    train.length = 5;
    memcpy(train.data,"file1",5);//组装第一列小火车
    //发送小火车
    send(netfd,&train,sizeof(train.length)+train.length,MSG_NOSIGNAL);
    int fd = open("file1",O_RDWR);
    struct stat statbuf;
    // 获取文件大小
    fstat(fd,&statbuf);
    // 发送小火车 火车头 size的长度 火车车厢 size的内容
    bzero(&train,sizeof(train));
    train.length = sizeof(statbuf.st_size);
    memcpy(train.data,&statbuf.st_size,train.length);
    send(netfd,&train,sizeof(train.length)+train.length,MSG_NOSIGNAL);
    // 使用mmap
    char *p = (char *)mmap(NULL,statbuf.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
    ERROR_CHECK(p,MAP_FAILED,"mmap");
    off_t totalsize = 0;//记录已经发送的长度
    while(totalsize < statbuf.st_size){
        if(statbuf.st_size - totalsize > (long )sizeof(train.data)){
            train.length = sizeof(train.data); // 剩余数据超过火车车厢的上限
        }
        else{
            train.length = statbuf.st_size - totalsize;
        }
        send(netfd,&train.length,sizeof(train.length),MSG_NOSIGNAL);
        send(netfd,p+totalsize,train.length,MSG_NOSIGNAL);
        totalsize += train.length;
    }
    //补发一个空火车
    train.length = 0;
    send(netfd,&train.length,sizeof(train.length),MSG_NOSIGNAL);
    munmap(p,statbuf.st_size);
    close(fd);
    return 0;
}
//int transFile(int netfd){
//    train_t train;
//    train.length = 5;
//    memcpy(train.data,"file1",5);//组装第一列小火车
//    //发送小火车
//    send(netfd,&train,sizeof(train.length)+train.length,MSG_NOSIGNAL);
//    int fd = open("file1",O_RDWR);
//    struct stat statbuf;
//    // 获取文件大小
//    fstat(fd,&statbuf);
//    // 发送小火车 火车头 size的长度 火车车厢 size的内容
//    bzero(&train,sizeof(train));
//    train.length = sizeof(statbuf.st_size);
//    memcpy(train.data,&statbuf.st_size,train.length);
//    send(netfd,&train,sizeof(train.length)+train.length,MSG_NOSIGNAL);
//    // 使用mmap
//    char *p = (char *)mmap(NULL,statbuf.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
//    ERROR_CHECK(p,MAP_FAILED,"mmap");
//    send(netfd,p,statbuf.st_size,MSG_NOSIGNAL);//一次性将整个文件的内容send过去
//    munmap(p,statbuf.st_size);
//    close(fd);
//    return 0;
//}
//int transFile(int netfd){
//    train_t train;
//    train.length = 5;
//    memcpy(train.data,"file1",5);//组装第一列小火车
//    //发送小火车
//    send(netfd,&train,sizeof(train.length)+train.length,MSG_NOSIGNAL);
//    int fd = open("file1",O_RDWR);
//    struct stat statbuf;
//    // 获取文件大小
//    fstat(fd,&statbuf);
//    // 发送小火车 火车头 size的长度 火车车厢 size的内容
//    bzero(&train,sizeof(train));
//    train.length = sizeof(statbuf.st_size);
//    memcpy(train.data,&statbuf.st_size,train.length);
//    send(netfd,&train,sizeof(train.length)+train.length,MSG_NOSIGNAL);
//    // 直接sendfile
//    sendfile(netfd,fd,NULL,statbuf.st_size);
//    close(fd);
//    return 0;
//}
